# -*- coding: utf-8 -*-
"""
******* 文档说明 ******
打印指定文件夹下所有文件名, 以CSV格式保存

# 当前项目: Tools
# 创建时间: 2018/8/8 22:00 
# 开发作者: Vincent
# 创建平台: PyCharm Community Edition    python 3.5
# 版    本: V1.0
"""
import os
import time
import argparse
import json
from PIL import Image


#  把时间戳转化为时间: 1479264792 to 2016-11-16 10:53:12
def time2str(timestamp):
    time_struct = time.localtime(timestamp)
    return time.strftime('%Y-%m-%d %H:%M:%S', time_struct)


#  把文件大小 xx B 转换成对应的最佳显示方式
def _size_h(size):
    if size >= 1024 * 1024 * 1024:
        return "{:.1f} GB".format(size / (1024 * 1024 * 1024))
    elif size >= 1024 * 1024:
        return "{:.1f} MB".format(size / (1024 * 1024))
    elif size >= 1024:
        return "{:.1f} KB".format(size / 1024)
    else:
        return "{:.0f} B".format(size)


# 打印指定路径下的 各文件信息
def print_file_list(path='.', txt_path=None):
    """
    path       检索文件夹路径   若无指定代表当前路径
    txt_path   检索结果文件保存路径， 若无指定路径，保存在当前路径下
    """

    path = os.path.abspath(path)

    print('Search Path:  【{}】    {}'.format(path, time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))))
    # 若没有指定保存文件名， 直接以搜索文件夹名称作为文件名
    if txt_path is None:
        txt_path = os.path.basename(path)

    f_txt_path = '{}_FileList.csv'.format(txt_path)
    f_txt = open(f_txt_path, 'w', encoding='utf8')
    print(' ' * 100, file=f_txt)
    print('序号,文件名,类型,大小,大小数值,图片尺寸,修改时间,路径层数,1级路径,2级路径,3级路径,4级路径,5级路径,', file=f_txt)

    # 当前检索路径所在层级
    raw_layer = len(path.split(os.sep))

    # 文件夹大小
    folder_size = 0
    # 文件序号
    file_index = 1

    # 遍历文件夹下所有路径
    for i, (root_i, dirs, files) in enumerate(os.walk(path, topdown=True)):
        print('\r{:d}   {}                         '.format(i, root_i), end='')
        path_layer = root_i.split(os.sep)  # 各层级名称

        # 检索对应的文件
        for ii, file_i in enumerate(files):
            # 当前文件路径
            f_path = os.path.join(root_i, file_i)

            # 文件大小
            try:
                f_size = os.path.getsize(f_path)
                folder_size += f_size
            except:
                f_size = 0

            # # 创建日期
            # f_ctime = time2str(os.path.getctime(f_path))

            # 修改日期
            try:
                f_mtime = time2str(os.path.getmtime(f_path))
            except:
                f_mtime = 'Error'

            # 图片尺寸
            if f_path.endswith('.jpg') or f_path.endswith('.JPG') or f_path.endswith('.png') or f_path.endswith('.PNG'):
                try:
                    # 图片大小
                    img_shape = '{}-{}'.format(*Image.open(f_path).size)
                except:
                    img_shape = '0'

            else:
                img_shape = ''

            # print('序号,文件名,类型,大小,大小数值,尺寸,修改时间,路径层数,1级路径,2级路径,3级路径,4级路径,5级路径,')
            print('{},"{}",{},{},{},{},{},{},{}'.format(
                file_index, file_i, file_i.split('.')[-1], _size_h(f_size), f_size, img_shape, f_mtime,
                len(path_layer) - raw_layer, ','.join(path_layer[raw_layer:])),
                file=f_txt)

            file_index += 1

    # 文件指针移动到文件头
    f_txt.seek(0)
    print('{}, Folder Size: {}'.format(path, _size_h(folder_size)), file=f_txt)

    print('\nSearch Over!  Folder Size: 【{}】  Result Save Path:  【{}】'.format(_size_h(folder_size),
                                                                              os.path.abspath(f_txt_path)))


if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        description="""
        文件搜索脚本
        """)

    # 训练样本文件名称
    parser.add_argument('-f', '--folder', default='.', help='待搜索的文件夹路径, 默认为当前目录')

    args = parser.parse_args()

    print_file_list(args.folder)
